package com.shujia

import scala.collection.mutable.ArrayBuffer

object Code21Array {
  def main(args: Array[String]): Unit = {

    /**
     * Array数组分为 可变数组和不可变数组
     *
     */

    var array = new Array[String](4)
    array.foreach(println)

    array(0) = "hello"
    array(1) = "scala"

    array.update(2, "hello")
    array.update(3, "java")

    // 遍历方式1：
    //   foreach中可以传入一个函数 该函数的传入值为 A表示数组中的数据类型 U表示无返回值 所以println可以使用
    array.foreach(println)
    array.foreach(printArr)

    def printArr(string: String): Unit = {
      println("elem:" + string)
    }


    // 遍历方式2：
    //   Java的风格，增强for 中间使用 <- 进行分割
    //   注意在Scala中并没有for i的形式
    for (elem <- array) {
      println("for:" + elem)
    }

    // 遍历方式3：
    var num: Int = array.size
    while (num > 0) {
      println("while:" + array(num - 1))
      num -= 1
    }


    val elem0: String = array.apply(0)
    println(elem0)
    val elem1: String = array.apply(1)
    println(elem1)


    println(array.mkString(","))
    array.take(3).foreach(println) // 取出前3的数据
    println(array.sorted.mkString(",")) //对数据按字典序排序
    println(array.tail.mkString(",")) // 获取除头以外其他数据
    println(array.head) // 获取第一个数据
    println(array.length)


    // 实现pop函数
    //   对于Scala来说Array不能直接修改，如果修改，那么可以返回一个新的Array


    while(array.size > 0) {
      println("pop:"+array.head)
      array = array.tail // tail每次会返回一个新的堆内存地址将引用赋予给array
    }


    /**
     *  可变数组
     *      ArrayBuffer:所在的包为：
     *        scala.collection.mutable 该包中保存的为可变类
     */

    val buffer: ArrayBuffer[Int] = new ArrayBuffer[Int]()
    buffer.append(1,2,3,4)
    println(buffer.mkString(","))
    buffer.foreach(println)
    buffer.update(0,5)
    println(buffer(0))

  }
}
